const axios = require('axios');

class QianwenService {
  constructor() {
    this.apiKey = process.env.QIANWEN_API_KEY;
    this.baseURL = 'https://dashscope.aliyuncs.com/api/v1';
    this.model = 'qwen-turbo';
    
    if (!this.apiKey) {
      throw new Error('QIANWEN_API_KEY is required');
    }
  }

  /**
   * 评分作文
   * @param {Object} exerciseData - 题目数据
   * @param {string} studentEssay - 学生作文
   * @returns {Promise<Object>} 评分结果
   */
  async scoreEssay(exerciseData, studentEssay) {
    try {
      const prompt = this.buildScoringPrompt(exerciseData, studentEssay);
      
      const response = await axios.post(`${this.baseURL}/services/aigc/text-generation/generation`, {
        model: this.model,
        input: {
          messages: [
            {
              role: 'system',
              content: '你是一位专业的雅思写作评分专家，请严格按照雅思官方评分标准进行评分。'
            },
            {
              role: 'user',
              content: prompt
            }
          ]
        },
        parameters: {
          temperature: 0.1,
          max_tokens: 2000
        }
      }, {
        headers: {
          'Authorization': `Bearer ${this.apiKey}`,
          'Content-Type': 'application/json'
        },
        timeout: 30000
      });

      console.log('通义千问API响应:', response.data);

      // 处理流式响应
      if (response.data && response.data.output) {
        const result = this.parseScoringResult(response.data.output.text);
        return result;
      } else if (response.data && response.data.output && response.data.output.finish_reason === 'stop') {
        // 处理完整的响应
        const result = this.parseScoringResult(response.data.output.text);
        return result;
      } else {
        throw new Error('API响应格式错误');
      }
    } catch (error) {
      console.error('通义千问API调用错误:', error);
      console.error('错误详情:', error.response?.data);
      throw error;
    }
  }

  /**
   * 构建评分提示词
   * @param {Object} exerciseData - 题目数据
   * @param {string} studentEssay - 学生作文
   * @returns {string} 完整的提示词
   */
  buildScoringPrompt(exerciseData, studentEssay) {
    return `
请作为雅思写作评分专家，对以下作文进行专业评分。

【题目信息】
标题: ${exerciseData.title}
内容: ${exerciseData.content}
类型: ${exerciseData.type}
难度: ${exerciseData.difficulty}

【学生作文】
${studentEssay}

【评分要求】
请按照雅思官方9分制评分标准，从以下四个维度进行评分：

1. Task Achievement (任务完成度) - 1-9分
2. Coherence and Cohesion (连贯性) - 1-9分  
3. Lexical Resource (词汇丰富度) - 1-9分
4. Grammatical Range and Accuracy (语法准确性) - 1-9分

【输出格式】
请严格按照以下JSON格式输出评分结果：

{
  "overall": 总分(1-9),
  "taskAchievement": 任务完成度分数(1-9),
  "coherence": 连贯性分数(1-9),
  "vocabulary": 词汇分数(1-9),
  "grammar": 语法分数(1-9),
  "feedback": "总体评价和建议",
  "strengths": ["优点1", "优点2", "优点3"],
  "improvements": ["改进建议1", "改进建议2", "改进建议3"]
}

请确保：
1. 分数必须是1-9之间的整数
2. 总分是四个维度分数的平均值（四舍五入）
3. 反馈要具体、专业、有建设性
4. 只输出JSON格式，不要其他内容
`;
  }

  /**
   * 解析评分结果
   * @param {string} responseText - API返回的文本
   * @returns {Object} 解析后的评分结果
   */
  parseScoringResult(responseText) {
    try {
      // 尝试提取JSON部分
      const jsonMatch = responseText.match(/\{[\s\S]*\}/);
      if (jsonMatch) {
        const result = JSON.parse(jsonMatch[0]);
        
        // 验证结果格式
        if (this.validateScoringResult(result)) {
          return result;
        }
      }
      
      // 如果解析失败，返回默认结果
      return this.getDefaultScoringResult();
    } catch (error) {
      console.error('解析评分结果失败:', error);
      return this.getDefaultScoringResult();
    }
  }

  /**
   * 验证评分结果格式
   * @param {Object} result - 评分结果
   * @returns {boolean} 是否有效
   */
  validateScoringResult(result) {
    const requiredFields = ['overall', 'taskAchievement', 'coherence', 'vocabulary', 'grammar'];
    
    for (const field of requiredFields) {
      if (typeof result[field] !== 'number' || result[field] < 1 || result[field] > 9) {
        return false;
      }
    }
    
    return true;
  }

  /**
   * 获取默认评分结果（API调用失败时使用）
   * @returns {Object} 默认评分结果
   */
  getDefaultScoringResult() {
    return {
      overall: 6,
      taskAchievement: 6,
      coherence: 6,
      vocabulary: 6,
      grammar: 6,
      feedback: "AI评分服务暂时不可用，已为您提供基础评分。建议稍后重试获取详细反馈。",
      strengths: ["作文结构清晰", "语言表达基本准确"],
      improvements: ["建议增加更多细节支撑", "可以尝试使用更丰富的词汇", "注意语法准确性"]
    };
  }

  /**
   * 测试API连接
   * @returns {Promise<boolean>} 连接是否成功
   */
  async testConnection() {
    try {
      const response = await axios.post(`${this.baseURL}/services/aigc/text-generation/generation`, {
        model: this.model,
        input: {
          messages: [
            {
              role: 'user',
              content: 'Hello, please respond with "API connection successful"'
            }
          ]
        },
        parameters: {
          temperature: 0.1,
          max_tokens: 100
        }
      }, {
        headers: {
          'Authorization': `Bearer ${this.apiKey}`,
          'Content-Type': 'application/json'
        },
        timeout: 10000
      });

      console.log('连接测试响应:', response.data);
      return response.status === 200;
    } catch (error) {
      console.error('API连接测试失败:', error);
      console.error('错误详情:', error.response?.data);
      return false;
    }
  }
}

module.exports = QianwenService;
